class Solution {
public:
    bool is_get(string& str,int left,int right)
    {
        while(left<right)
        {
            if(str[left]!=str[right])
            {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }//这个函数用于判断str从left开始到达right的这端位置是否是回文串
    vector<vector<string>> ret;
    vector<string> path;
    void dfs(string& str,int start)
    {
        //必须选择这个从start开始往后num个数字
        if(start == str.size())
        {
            //遍历完成了整个数字
            ret.push_back(path);
            return;
        }
        for(int j = start;j<str.size();j++)
        {
            //枚举子串结束的位置
            if(is_get(str,start,j))//检测从strat到达j这个子串是否是符合条件的回文子串
            {
                path.push_back(str.substr(start,j-start+1));
                dfs(str,j+1);//将这个子串结束的位置+1，当作下一个子串开始的位置
                path.pop_back();//回溯恢复现场
            }
        }
    }
    vector<vector<string>> partition(string s) {
    //站在答案的视角去进行枚举每一次dfs都需要选择一个数字当作一个符合条件的子集
    dfs(s,0);
    return ret;
    }
};